package com.example.amer.story.core.common.exception;

import com.example.amer.story.core.common.constant.ErrorCodeEnum;
import com.example.amer.story.core.common.resp.RestResp;
// Slf4j 是 Lombok 提供的一个注解，用于自动生成日志对象，简化 Java 类中的日志记录。
// 它可以自动为类生成一个名为 log 的日志对象，而不需要开发者手动创建它。
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
// 该注解是Spring MVC的注解，主要用于处理应用程序中的全局异常和全局数据绑定问题
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 通用异常处理器
 */
@Slf4j
@RestControllerAdvice
public class CommonExceptionHandler {
    /**
     * 处理数据校验异常
     */
    @ExceptionHandler(BindException.class)
    public RestResp<Void> handlerBindException(BindException e) {
        log.error(e.getMessage(), e);
        return RestResp.fail(ErrorCodeEnum.USER_REQUEST_PARAM_ERROR);
    }

    /**
     * 处理业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public RestResp<Void> handlerBusinessException(BusinessException e) {
        log.error(e.getMessage(), e);
        return RestResp.fail(e.getErrorCodeEnum());
    }

    /**
     * 处理系统异常
     */
    @ExceptionHandler(Exception.class)
    public RestResp<Void> handlerException(Exception e) {
        log.error(e.getMessage(), e);
        return RestResp.error();
    }
}
